package com.xb.loan.cashier.biz.pay.unionpay;

import com.xb.loan.cashier.biz.util.Configure;
import com.xb.loan.util.DateHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 银联支付
 * @author zljun
 *
 * 2016年5月11日
 */
public class UnionPayment {
    
	private static Logger log = LoggerFactory.getLogger(UnionPayment.class);
	
	public final static String TRADE_SUCCESS = "00";
	
    /**
     * 下载账单
     * @param merId
     * @param settleDate
     * @param url
     * @return
     */
    public static File downloadBill(String merId, String settleDate, String url){
    	/*String merId = cashierPayChannel.getChannelUser();
        String settleDate = DateHelper.formatDate("MMdd", DateHelper.getBeforeDay(new Date(), -1));
        String url = cashierPayChannel.getQueryUrlBatch();*/
        
        log.info("downloadBill 开始下载银联对账文件 merId="+merId+",settleDate="+settleDate+",url="+url);
		
		Map<String, String> data = new HashMap<String, String>();
		
		/***银联全渠道系统，产品参数，除了encoding自行选择外其他不需修改***/
		data.put("version", UnionPayConstants.version);       //版本号 全渠道默认值
		data.put("encoding", UnionPayConstants.encoding_UTF8);//字符集编码 可以使用UTF-8,GBK两种方式
		data.put("signMethod", "01");                        //签名方法 目前只支持01-RSA方式证书加密
		data.put("txnType", "76");                           //交易类型 76-对账文件下载
		data.put("txnSubType", "01");                        //交易子类型 01-对账文件下载
		data.put("bizType", "000000");                       //业务类型，固定
		/***商户接入参数***/
		data.put("accessType", "0");                         //接入类型，商户接入填0，不需修改
		data.put("merId", merId);       //商户代码，请替换正式商户号测试，如使用的是自助化平台注册的777开头的商户号，该商户号没有权限测文件下载接口的，请使用测试参数里写的文件下载的商户号和日期测。如需777商户号的真实交易的对账文件，请使用自助化平台下载文件。
		data.put("settleDate", settleDate);        //清算日期，如果使用正式商户号测试则要修改成自己想要获取对账文件的日期， 测试环境如果使用700000000000001商户号则固定填写0119
		data.put("txnTime", DateHelper.formatDate("yyyyMMddHHmmss", new Date())); //订单发送时间，取系统时间，格式为YYYYMMDDhhmmss，必须取当前时间，否则会报txnTime无效
		data.put("fileType", "00");                          //文件类型，一般商户填写00即可
		
		Map<String, String> reqData = null;
		File file = null;
		try {
			reqData = UnionPayAcpService.sign(data,UnionPayConstants.encoding_UTF8);
		} catch (Exception e) {
			log.error("downloadBill error="+e.getMessage());
		}
		//报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
		Map<String, String> rspData =  UnionPayAcpService.post(reqData,url,UnionPayConstants.encoding_UTF8);
		//应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
		if(!rspData.isEmpty()){
			if(UnionPayAcpService.validate(rspData, UnionPayConstants.encoding_UTF8)){
				String respCode = rspData.get("respCode");
				String respMsg = rspData.get("respMsg");
				if("00".equals(respCode)){
					//交易成功，解析返回报文中的fileContent并落地
					String path = Configure.getStringValue("charge.accountFiles.savePath")+ File.separator+"unionPay";
					File f = new File(path);
					if (!f.exists()) {
						f.mkdirs();
					}
					try {
						UnionPayAcpService.deCodeFileContent(rspData,f.getAbsolutePath(),UnionPayConstants.encoding_UTF8);
						file = new File(path+ File.separator + rspData.get("fileName"));
					} catch (Exception e) {
						log.error("downloadBill 下载文件失败",e);
						return null;
					}
				}else{
					log.info("downloadBill 对账文件下载失败 respCode="+respCode+",respMsg="+respMsg);
				}
			}else{
				log.info("downloadBill 验证签名失败");
			}
		}else{
			//未返回正确的http状态
			log.info("downloadBill 未获取到返回报文或返回http状态码非200");
		}
		return file;
    }
}
